#include <stdio.h>

#define LEN 10
#define swap(type,a,b)  do { type c=a; a=b; b=c; } while(0)

void qsort(double *, int, int);

int main(void)
{
    int i;
    double source[LEN] = {44.1, 12.2, 3.3, 1.0, 14.4, 15.5, 2.5, 20.4, 100.0, 50.9};
    printf("before sort:\n");
    for (i=0; i<LEN; ++i) {
        printf("%.2lf ", source[i]);
    }
    putchar('\n');

    qsort(source, 0, LEN - 1);
    printf("\nafter sort:\n");
    for (i=0; i<LEN; ++i) {
        printf("%.2lf ", source[i]);
    }
    putchar('\n');
    return 0;
}

void qsort(double * dst, int start, int end)
{
    int pos, i;

    if (start > end) return;

    for (pos = start, i = start+1; i <= end; ++i)
        if (dst[i] > dst[start]){
            ++pos;  //因为使用函数式宏 所以不能和下一行 合并成一行
            swap(double, dst[i], dst[pos]);
        }

    swap(double, dst[pos], dst[start]);

    qsort(dst, start, pos-1);
    qsort(dst, pos+1, end);
}

void qqsort(int * dst, int s, int e)
{
    int i;
    int pos;

    if (s > e) return;

    for (pos = s, i=s+1; i <= e; ++i)
    {
        if (dst[i] < dst[s]) {
            ++pos;
            swap(int, dst[pos], dst[i]);
        }
    }
    swap(int, dst[pos], dst[s]);

    qqsort(dst, s, pos - 1);
    qqsort(dst, pos+1, e);
}
